package cli;

import java.io.File;
import java.io.FileOutputStream;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class Rapport {

	static Element racine;
	static Document document;

	static void enregistre(String fichier) {
		try {
			// On utilise ici un affichage classique avec getPrettyFormat()
			XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
			// Remarquez qu'il suffit simplement de créer une instance de
			// FileOutputStream
			// avec en argument le nom du fichier pour effectuer la
			// sérialisation.
			sortie.output(document, new FileOutputStream(fichier));
		} catch (java.io.IOException e) {
		}
	}

	public static Element init(String filepath) {

		SAXBuilder sax = new SAXBuilder();
		try {
			document = sax.build(new File(filepath));
			racine = document.getRootElement();
			racine.removeContent();
		} catch (Exception e) {
			racine = new Element("html");
			document = new Document(racine);
		}

		// Création <head>
		Element head = new Element("head");
		racine.addContent(head);

		Element title = new Element("title");
		title.setText("Rapport");
		head.addContent(title);

		Element link = new Element("link").setAttribute("rel", "stylesheet")
				.setAttribute("href", "style.css");
		head.addContent(link);

		// Création <body>

		Element body = new Element("body");
		racine.addContent(body);

		Element h1 = new Element("h1");
		h1.setText("Présentation des résultats");
		body.addContent(h1);

		return body;

	}

	public static void createTable(Element body, String file) {

		double recette_concert = 0;
		double recette_hockey = 0;
		double total = 0;
		
		String file_xml = file;

		ArrayList<String> al = new ArrayList<String>();
		Element table = new Element("table");
		table.setAttribute("style", "border: 1px solid black");

		// On construit le <th>
		Element th = buildTh();
		table.addContent(th);

		// On récupère l'ensemble des manifestations et réservations de la bdd
		// xml

		// On initialise un objet XML
		XML db = new XML();

		// liste de toutes les réservations
		ArrayList<Element> reservations = db.getResa(file);

		// On récupère tous les évènements et on les liste

		Element root = db.getRootofFile(file_xml);
		ArrayList<Element> manifs = db.getManifs(root);
		Iterator<Element> k = manifs.iterator();

		Timestamp stamp = new Timestamp(System.currentTimeMillis());
		Date now = new Date(stamp.getTime());

		while (k.hasNext()) {
			Element courant = k.next();
			if (!courant.getName().equals("Patinage")) {
				Date date_evt = null;
				try {
					date_evt = new SimpleDateFormat("dd/MM/yy").parse(courant.getChildText("Date"));
				} catch (ParseException e) {
					e.printStackTrace();
				}
				if (!date_evt.after(now)) {
					ArrayList arrayliste = buildTr(courant);
					String id = courant.getChildText("Ref_evt");
					int prix = Integer.parseInt(courant.getChildText("Prix"));
					Element tr = (Element) arrayliste.get(0);
					// On compte combien de réservations ont été faites pour cet
					// evenement
					ArrayList list = countReservationForId(id, reservations,
							prix);
					int nb_resa = (Integer) list.get(0);
					int moins25 = (Integer) list.get(1);
					int plus40 = (Integer) list.get(2);
					int milieu = (Integer) list.get(3);
					double recette = (Double) list.get(4);
					int totale_places = (Integer) arrayliste.get(1);
					int places_restantes = totale_places - nb_resa;

					Element nombre_resa = new Element("td").setText(String
							.valueOf(nb_resa));
					tr.addContent(nombre_resa);
					Element nombre_restant = new Element("td").setText(String
							.valueOf(places_restantes));
					tr.addContent(nombre_restant);
					tr.addContent(new Element("td").setText(String
							.valueOf(moins25)));
					tr.addContent(new Element("td").setText(String
							.valueOf(milieu)));
					tr.addContent(new Element("td").setText(String
							.valueOf(plus40)));
					tr.addContent(new Element("td").setText(
							String.valueOf(recette)).setAttribute("class",
							"recette"));
					table.addContent(tr);

					if (courant.getName().equals("Concert")) {
						recette_concert = recette_concert + recette;
						total = total + recette;
					} else if (courant.getName().equals("Hockey")) {
						recette_hockey = recette_hockey + recette;
						total = total + recette;
					}
				}
			}

		}

		// Il reste à ajouter le tableau au body

		body.addContent(table);
		body.addContent(new Element("br"));
		body.addContent(new Element("h1").setText("Synthèse"));

		DecimalFormat df = new DecimalFormat("#.##");
		df.setRoundingMode(RoundingMode.HALF_UP);

		Element table2 = new Element("table");
		table2.setAttribute("style", "border: 1px solid black");

		Element tr1 = new Element("tr");
		tr1.addContent(new Element("td").setText("Recettes Hockey"));
		tr1.addContent(new Element("td").setText(String.valueOf(recette_hockey
				+ "€")));
		tr1.addContent(new Element("td").setText(String.valueOf(df
				.format(recette_hockey / total * 100) + "%")));
		table2.addContent(tr1);
		Element tr2 = new Element("tr");
		tr2.addContent(new Element("td").setText("Recettes Concert"));
		tr2.addContent(new Element("td").setText(String.valueOf(recette_concert
				+ "€")));
		tr2.addContent(new Element("td").setText(String.valueOf(df
				.format(recette_concert / total * 100) + "%")));
		table2.addContent(tr2);
		Element tr3 = new Element("tr");
		tr3.addContent(new Element("td").setText("Total"));
		tr3.addContent(new Element("td").setText(String.valueOf(total) + "€"));
		tr3.addContent(new Element("td").setText("100%"));
		table2.addContent(tr3);

		body.addContent(table2);
	}

	public static ArrayList buildTr(Element event) {
		Element tr = new Element("tr");
		int i;

		String type = event.getName();

		ArrayList<String> liste = new ArrayList<String>();

		String Ref_evt = event.getChildText("Ref_evt");
		liste.add(Ref_evt);
		liste.add(type);
		String date = event.getChildText("Date");
		liste.add(date);
		String HeureDebut = event.getChildText("Heure_début");
		liste.add(HeureDebut);
		String HeureFin = event.getChildText("Heure_fin");
		liste.add(HeureFin);
		String prix = event.getChildText("Prix");
		liste.add(prix);
		String places = event.getChildText("Places");
		liste.add(places);
		String artiste = event.getChildText("Artiste");
		liste.add(artiste);
		String style = event.getChildText("Style");
		liste.add(style);
		String equipe1 = event.getChildText("Equipe_1");
		liste.add(equipe1);
		String equipe2 = event.getChildText("Equipe_2");
		liste.add(equipe2);
		String competition = event.getChildText("Competition");
		liste.add(competition);
		String arbitre = event.getChildText("Abritre");
		liste.add(arbitre);

		for (i = 0; i < liste.size(); i++) {
			Element td = new Element("td").setText(liste.get(i));
			if (i == 1)
				td.setAttribute("class", "type");
			tr.addContent(td);
		}

		ArrayList aliste = new ArrayList();
		aliste.add(tr);
		aliste.add(Integer.parseInt(places));

		return aliste;
	}

	public static Element buildTh() {
		Element th = new Element("tr");

		th.addContent(new Element("th").setText("Ref_evt"));
		th.addContent(new Element("th").setText("Type"));
		th.addContent(new Element("th").setText("Date"));
		th.addContent(new Element("th").setText("Heure Début"));
		th.addContent(new Element("th").setText("Heure Fin"));
		th.addContent(new Element("th").setText("Prix"));
		th.addContent(new Element("th").setText("Places"));
		th.addContent(new Element("th").setText("Artiste"));
		th.addContent(new Element("th").setText("Style"));
		th.addContent(new Element("th").setText("Equipe 1"));
		th.addContent(new Element("th").setText("Equipe 2"));
		th.addContent(new Element("th").setText("Compétition"));
		th.addContent(new Element("th").setText("Arbitre"));
		th.addContent(new Element("th").setText("Nb Réservation"));
		th.addContent(new Element("th").setText("Places libres"));
		th.addContent(new Element("th").setText("< 25"));
		th.addContent(new Element("th").setText("25 - 40"));
		th.addContent(new Element("th").setText("> 40"));
		th.addContent(new Element("th").setText("Recette"));

		return th;
	}

	public static ArrayList<Integer> countReservationForId(String id,
			ArrayList<Element> alist, int prix) {
		String nb_resa;
		int compteur = 0;
		int moins25 = 0;
		int milieu = 0;
		int plus40 = 0;
		int age;
		int pourcent = 0;
		double recette = 0;

		Iterator<Element> i = alist.iterator();

		while (i.hasNext()) {
			Element elt = i.next();
			String ref = elt.getChildText("Ref_evt");
			if (ref.equals(id)) {
				compteur++;
				age = Integer.parseInt(elt.getChildText("Age"));
				if (age < 25)
					moins25++;
				else if (age > 40)
					plus40++;
				else
					milieu++;
				if (elt.getChildText("Réduction").endsWith("%"))
					pourcent = Integer
							.parseInt(elt.getChildText("Réduction").substring(
									0,
									elt.getChildText("Réduction").length() - 1));
				else
					pourcent = Integer.parseInt(elt.getChildText("Réduction"));
				recette = recette + prix * (1 + (double) pourcent / 100);
			}
		}

		nb_resa = String.valueOf(compteur);

		ArrayList liste = new ArrayList<Integer>();
		liste.add(compteur);
		liste.add(moins25);
		liste.add(plus40);
		liste.add(milieu);
		liste.add(recette);

		return liste;
	}

	public static void addStats(Element body) {
		Element table = body.getChild("table");
		List<Element> trs = table.getChildren("tr");
		Iterator<Element> i = trs.iterator();

		// On parcourt chaque ligne.
		while (i.hasNext()) {

			Element courant = i.next();
			List<Element> tds = courant.getChildren("td");
			// On parcourt tous les td et on cherche ceux qui nous intéressent.
			Iterator<Element> j = tds.iterator();
			while (j.hasNext()) {
				// On récupère le type et la recette pour l'event
				Element current = j.next();
				if (current.getAttributeValue("class").equals("concert")) {
					// recette_concert = recette_concert +
				}

			}

		}

	}

}
